#include "volumetool.h"
#include "ui_volumetool.h"
#include <QGraphicsDropShadowEffect>
#include <QDebug>
#include <QPainter>
#include <QCursor>
VolumeTool::VolumeTool(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VolumeTool),
    isMuted(false), //默认为非静音状态
    volumeRatio(20) //默认音量大小为20%
{
    ui->setupUi(this);
    //设置此窗口为弹出窗口
    setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
    //将窗口设置为透明状态
    setAttribute(Qt::WA_TranslucentBackground);
    //Qt::FramelessWindowHint:在windows中，将窗口设置为透明状态时，windows默认颜色为黑色，
    //要将其实现为透明就需要添加Qt::FramelessWindowHint状态
    //Qt::NoDropShadowWindowHint:去掉这个音量调节的弹出窗口的默认阴影效果

    //自定义实现阴影效果
    //创建阴影效果对象
    QGraphicsDropShadowEffect *shadowEffect=new QGraphicsDropShadowEffect(this);
    //设置颜色
    shadowEffect->setColor("#646464");
    //设置四角的圆角效果
    shadowEffect->setBlurRadius(10);
    //设置阴影位置,将这个阴影效果贴在此音量弹出窗口上(左上角)
    shadowEffect->setOffset(0,0);
    //设置这个阴影效果给此音量调节窗口
    this->setGraphicsEffect(shadowEffect);

    //设置音量按钮图标
    ui->silenceBtn->setIcon(QIcon(":/images/volumn.png"));
    //将音量设置为20%
    ui->volumeRatio->setText("20%");
    //设置outLine尺寸
    //获取原本的outLine尺寸
    QRect rect=ui->outLine->geometry();
    qDebug()<<rect;
    //更新outLine窗体高度只显示20%
    //ui->outLine->setGeometry(rect.x(),rect.y()+(180-36),rect.width(),36);
    ui->outLine->setGeometry(rect.x(),rect.y()+(rect.height()-rect.height()*0.2),rect.width(),rect.height()*0.2);
    //移动音量调节按钮到20%音量位置处
    ui->silderBtn->move(ui->silderBtn->x(),ui->outLine->y()-(ui->silderBtn->height()/2));

    //点击静音按钮信号与槽函数关联
    connect(ui->silenceBtn,&QPushButton::clicked,this,&VolumeTool::onSilenceBtnClicked);

    //安装事件拦截器
    ui->volumeBox->installEventFilter(this);
}

VolumeTool::~VolumeTool()
{
    delete ui;
}

//绘图事件函数
void VolumeTool::paintEvent(QPaintEvent *event)
{
    (void)event;
    //绘制volumeTool界面下的三角
    //创建绘画者对象,让绘画者在此VolumeTool页面进行绘画
    QPainter painter(this);
    //设置画笔,让其没有边界效果
    painter.setPen(Qt::NoPen);
    //设置画刷，让其填充的颜色为白色
    painter.setBrush(QBrush(Qt::white));
    //构建三角形对象
    QPolygon polygon;
    //设置三角形的三个点
    QPoint a(10+10,300);
    QPoint b(10+10+60,300);
    QPoint c(10+10+30,300+30);
    //将这三个点添加至三角形对象中
    polygon.append(a);
    polygon.append(b);
    polygon.append(c);
    //让绘画者对象开始绘制该三角形
    painter.drawPolygon(polygon);

}
//点击静音按钮后的槽函数
void VolumeTool::onSilenceBtnClicked()
{
    //静音 非静音状态切换
    isMuted=!isMuted;
    //两种状态的图片切换
    if(isMuted==true)
    {
        //静音状态
        ui->silenceBtn->setIcon(QIcon(":/images/silent.png"));
    }
    else
    {
        //非静音状态
        ui->silenceBtn->setIcon(QIcon(":/images/volumn.png"));
    }
    //发送媒体静音设置的自定义信号，让QQMusic去处理
    emit setMusicMuted(isMuted);
}
//事件过滤-过滤鼠标按下、鼠标释放、鼠标滚动事件
bool VolumeTool::eventFilter(QObject *watched, QEvent *event)
{
    //检测控件
    if(ui->volumeBox==watched)
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            //鼠标按下事件
            //计算音量大小做相关操作
            calcVolume();
        }
        else if(event->type()==QEvent::MouseButtonRelease)
        {
            //鼠标释放事件
            //发射信号让QQMusic去处理
            emit setMusicVolume(volumeRatio);
        }
        else if(event->type()==QEvent::MouseMove)
        {
            //鼠标移动事件(拖拽)
            //计算音量大小做相关操作
            calcVolume();
            //发射信号让QQMusic去处理
            emit setMusicVolume(volumeRatio);
        }
        //这三个事件都进行拦截
        return true;
    }
    //剩下的事件交给父类去处理
    return QObject::eventFilter(watched,event);
}
//计算音量大小做相关操作
void VolumeTool::calcVolume()
{
    //获取鼠标点击时的y坐标
    int height=ui->volumeBox->mapFromGlobal(QCursor().pos()).y();
    //鼠标点击的坐标是相对屏幕的，获取其y坐标，然后利用mapToGlobal转化为此volumeBox控件内的坐标
    //验证height的合法性[25, 205]
    height=height<25?25:height;
    height=height>205?205:height;
    //更新outLine高低
    ui->outLine->setGeometry(ui->outLine->x(),height,ui->outLine->width(),205-height);
    //更新sliderBtn位置
    //sliderBtn的位置
    //sliderBtn实际就是一个矩形，设置了圆角效果，所以呈现的是圆形
    //移动sliderBtn实际就是重新找其矩形左上角的位置，左上角位置就是outLine左上角的y坐标-sliderBtn的高度的一半即可
    //sliderBtn的圆心刚好和ui->outLine的上边界平齐
    ui->silderBtn->move(ui->silderBtn->x(),ui->outLine->y()-ui->silderBtn->height()/2);
    //计算音量大小
    volumeRatio=(int)(ui->outLine->height()/(float)180*100);
    //更新音量百分比
    ui->volumeRatio->setText(QString::number(volumeRatio)+"%");
}
